ZGlmZiAtLWdpdCBhL2JvYXJkL21wbC9jb21tb24vY29tbW9uX3V0aWwuYyBiL2JvYXJkL21wbC9jb21tb24vY29tbW9uX3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGM0OWFmCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvbXBsL2NvbW1vbi9jb21tb25fdXRpbC5jCkBAIC0wLDAgKzEsNjA2IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAxCisgKiBEZW5pcyBQZXRlciwgTVBMIEFHIFN3aXR6ZXJsYW5kLCBkLnBldGVyQG1wbC5jaAorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPHZpZGVvX2ZiLmg+CisjaW5jbHVkZSAiY29tbW9uX3V0aWwuaCIKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8aTJjLmg+CisjaW5jbHVkZSA8ZGV2aWNlcy5oPgorI2luY2x1ZGUgPHBjaS5oPgorCitleHRlcm4gaW50ICBndW56aXAgKHZvaWQgKiwgaW50LCB1bnNpZ25lZCBjaGFyICosIGludCAqKTsKK2V4dGVybiBpbnQgbWVtX3Rlc3QodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyByYW1zaXplLCBpbnQgcXVpZXQpOworCisjZGVmaW5lIEkyQ19CQUNLVVBfQUREUiAweDdDMDAgLyogMHgyMDAgYnl0ZXMgZm9yIGJhY2t1cCAqLworI2RlZmluZSBJTUFHRV9TSVpFIDB4ODAwMDAKKworZXh0ZXJuIGZsYXNoX2luZm9fdCBmbGFzaF9pbmZvW107CS8qIGluZm8gZm9yIEZMQVNIIGNoaXBzICovCisKK2ltYWdlX2hlYWRlcl90IGhlYWRlcjsKKworCisKK2ludCBtcGxfcHJnKHVuc2lnbmVkIGxvbmcgc3JjLHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXJ0OworCWZsYXNoX2luZm9fdCAqaW5mbzsKKwlpbnQgaSxyYzsKKwl1bnNpZ25lZCBsb25nICptYWdpYyA9ICh1bnNpZ25lZCBsb25nICopc3JjOworCisJaW5mbyA9ICZmbGFzaF9pbmZvWzBdOworICAJc3RhcnQgPSAwIC0gc2l6ZTsKKwlmb3IoaT1pbmZvLT5zZWN0b3JfY291bnQtMTtpPjA7aS0tKQorCXsKKwkJaW5mby0+cHJvdGVjdFtpXSA9IDA7IC8qIHVucHJvdGVjdCB0aGlzIHNlY3RvciAqLworCQlpZihzdGFydD49aW5mby0+c3RhcnRbaV0pCisJCWJyZWFrOworCX0KKwkvKiBzZXQtdXAgZmxhc2ggbG9jYXRpb24gKi8KKwkvKiBub3cgZXJhc2UgZmxhc2ggKi8KKwlpZihtYWdpY1swXSE9SUhfTUFHSUMpIHsKKwkJcHJpbnRmKCJCYWQgTWFnaWMgbnVtYmVyXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlwcmludGYoIkVyYXNpbmcgYXQgJWx4IChzZWN0b3IgJWQpIChzdGFydCAlbHgpXG4iLAorCQkJCXN0YXJ0LGksaW5mby0+c3RhcnRbaV0pOworCWZsYXNoX2VyYXNlIChpbmZvLCBpLCBpbmZvLT5zZWN0b3JfY291bnQtMSk7CisJcHJpbnRmKCJmbGFzaCBlcmFzZWQsIHByb2dyYW1taW5nIGZyb20gMHglbHggMHglbHggQnl0ZXNcbiIsc3JjLHNpemUpOworCWlmICgocmMgPSBmbGFzaF93cml0ZSAoKHVjaGFyICopc3JjLCBzdGFydCwgc2l6ZSkpICE9IDApIHsKKwkJcHV0cyAoIkVSUk9SICIpOworCQlmbGFzaF9wZXJyb3IgKHJjKTsKKwkJcmV0dXJuICgxKTsKKwl9CisJcHV0cyAoIk9LIHByb2dyYW1taW5nIGRvbmVcbiIpOworCXJldHVybiAwOworfQorCisKK2ludCBtcGxfcHJnX2ltYWdlKHVuc2lnbmVkIGxvbmcgbGRfYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIGRhdGEsbGVuLGNoZWNrc3VtOworCWltYWdlX2hlYWRlcl90ICpoZHI9JmhlYWRlcjsKKwkvKiBDb3B5IGhlYWRlciBzbyB3ZSBjYW4gYmxhbmsgQ1JDIGZpZWxkIGZvciByZS1jYWxjdWxhdGlvbiAqLworCW1lbWNweSAoJmhlYWRlciwgKGNoYXIgKilsZF9hZGRyLCBzaXplb2YoaW1hZ2VfaGVhZGVyX3QpKTsKKwlpZiAoaGRyLT5paF9tYWdpYyAgIT0gSUhfTUFHSUMpIHsKKwkJcHJpbnRmICgiQmFkIE1hZ2ljIE51bWJlclxuIik7CisJCXJldHVybiAxOworCX0KKwlwcmludF9pbWFnZV9oZHIoaGRyKTsKKwlpZiAoaGRyLT5paF9vcyAgIT0gSUhfT1NfVV9CT09UKSB7CisJCXByaW50ZiAoIk5vIFUtQm9vdCBJbWFnZVxuIik7CisJCXJldHVybiAxOworCX0KKwlpZiAoaGRyLT5paF90eXBlICAhPSBJSF9UWVBFX0ZJUk1XQVJFKSB7CisJCXByaW50ZiAoIk5vIEZpcm13YXJlIEltYWdlXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCWRhdGEgPSAodWxvbmcpJmhlYWRlcjsKKwlsZW4gID0gc2l6ZW9mKGltYWdlX2hlYWRlcl90KTsKKwljaGVja3N1bSA9IGhkci0+aWhfaGNyYzsKKwloZHItPmloX2hjcmMgPSAwOworCWlmIChjcmMzMiAoMCwgKGNoYXIgKilkYXRhLCBsZW4pICE9IGNoZWNrc3VtKSB7CisJCXByaW50ZiAoIkJhZCBIZWFkZXIgQ2hlY2tzdW1cbiIpOworCQlyZXR1cm4gMTsKKwl9CisJZGF0YSA9IGxkX2FkZHIgKyBzaXplb2YoaW1hZ2VfaGVhZGVyX3QpOworCWxlbiAgPSBoZHItPmloX3NpemU7CisJcHJpbnRmICgiVmVyaWZ5aW5nIENoZWNrc3VtIC4uLiAiKTsKKwlpZiAoY3JjMzIgKDAsIChjaGFyICopZGF0YSwgbGVuKSAhPSBoZHItPmloX2RjcmMpIHsKKwkJcHJpbnRmICgiQmFkIERhdGEgQ1JDXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCXN3aXRjaCAoaGRyLT5paF9jb21wKSB7CisJY2FzZSBJSF9DT01QX05PTkU6CisJCWJyZWFrOworCWNhc2UgSUhfQ09NUF9HWklQOgorCQlwcmludGYgKCIgIFVuY29tcHJlc3NpbmcgIC4uLiAiKTsKKwkJaWYgKGd1bnppcCAoKHZvaWQgKikoZGF0YSsweDEwMDAwMCksIDB4NDAwMDAwLAorCQkJICAgICh1Y2hhciAqKWRhdGEsIChpbnQgKikmbGVuKSAhPSAwKSB7CisJCQlwcmludGYgKCJHVU5aSVAgRVJST1JcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJZGF0YSs9MHgxMDAwMDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZiAoIiAgIFVuaW1wbGVtZW50ZWQgY29tcHJlc3Npb24gdHlwZSAlZFxuIiwgaGRyLT5paF9jb21wKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcHJpbnRmICgiICBPS1xuIik7CisJcmV0dXJuKG1wbF9wcmcoZGF0YSxsZW4pKTsKK30KKworCit2b2lkIGdldF9iYWNrdXBfdmFsdWVzKGJhY2t1cF90ICpidWYpCit7CisJaTJjX3JlYWQoQ0ZHX0RFRl9FRVBST01fQUREUiwgSTJDX0JBQ0tVUF9BRERSLDIsKHZvaWQgKilidWYsc2l6ZW9mKGJhY2t1cF90KSk7Cit9CisKK3ZvaWQgc2V0X2JhY2t1cF92YWx1ZXMoaW50IG92ZXJ3cml0ZSkKK3sKKwliYWNrdXBfdCBiYWNrOworCWludCBpOworCisJZ2V0X2JhY2t1cF92YWx1ZXMoJmJhY2spOworCWlmKCFvdmVyd3JpdGUpIHsKKwkJaWYoc3RybmNtcChiYWNrLnNpZ25hdHVyZSwiTVBMXDAiLDQpPT0wKSB7CisJCQlwcmludGYoIk5vdCBwb3NzaWJsZSB0byB3cml0ZSBCYWNrdXBcbiIpOworCQkJcmV0dXJuOworCQl9CisJfQorCW1lbWNweShiYWNrLnNpZ25hdHVyZSwiTVBMXDAiLDQpOworCWk9Z2V0ZW52X3IoInNlcmlhbCMiLGJhY2suc2VyaWFsX25hbWUsMTYpOworCWlmKGk9PTApIHsKKwkJcHJpbnRmKCJOb3QgcG9zc2libGUgdG8gd3JpdGUgQmFja3VwXG4iKTsKKwkJcmV0dXJuOworCX0KKwliYWNrLnNlcmlhbF9uYW1lWzE2XT0wOworCWk9Z2V0ZW52X3IoImV0aGFkZHIiLGJhY2suZXRoX2FkZHIsMjApOworCWlmKGk9PTApIHsKKwkJcHJpbnRmKCJOb3QgcG9zc2libGUgdG8gd3JpdGUgQmFja3VwXG4iKTsKKwkJcmV0dXJuOworCX0KKwliYWNrLmV0aF9hZGRyWzIwXT0wOworCWkyY193cml0ZShDRkdfREVGX0VFUFJPTV9BRERSLCBJMkNfQkFDS1VQX0FERFIsMiwodm9pZCAqKSZiYWNrLHNpemVvZihiYWNrdXBfdCkpOworfQorCit2b2lkIGNsZWFyX2Vudl92YWx1ZXModm9pZCkKK3sKKwliYWNrdXBfdCBiYWNrOworCXVuc2lnbmVkIGNoYXIgZW52X2NyY1s0XTsKKworCW1lbXNldCgmYmFjaywweGZmLHNpemVvZihiYWNrdXBfdCkpOworCW1lbXNldChlbnZfY3JjLDB4MDAsNCk7CisJaTJjX3dyaXRlKENGR19ERUZfRUVQUk9NX0FERFIsSTJDX0JBQ0tVUF9BRERSLDIsKHZvaWQgKikmYmFjayxzaXplb2YoYmFja3VwX3QpKTsKKwlpMmNfd3JpdGUoQ0ZHX0RFRl9FRVBST01fQUREUixDRkdfRU5WX09GRlNFVCwyLCh2b2lkICopZW52X2NyYyw0KTsKK30KKworLyoKKyAqIGNoZWNrIGNyYyBvZiAib2xkZXIiIGVudmlyb25tZW50CisgKi8KK2ludCBjaGVja19lbnZfb2xkX3NpemUodWxvbmcgb2xkc2l6ZSkKK3sKKwl1bG9uZyBjcmMsIGxlbiwgbmV3OworCXVuc2lnbmVkIG9mZjsKKwl1Y2hhciBidWZbNjRdOworCisJLyogcmVhZCBvbGQgQ1JDICovCisJZWVwcm9tX3JlYWQgKENGR19ERUZfRUVQUk9NX0FERFIsCisJCSAgICAgQ0ZHX0VOVl9PRkZTRVQsCisJCSAgICAgKHVjaGFyICopJmNyYywgc2l6ZW9mKHVsb25nKSk7CisKKwluZXcgPSAwOworCWxlbiA9IG9sZHNpemU7CisJb2ZmID0gc2l6ZW9mKGxvbmcpOworCWxlbiA9IG9sZHNpemUtb2ZmOworCXdoaWxlIChsZW4gPiAwKSB7CisJCWludCBuID0gKGxlbiA+IHNpemVvZihidWYpKSA/IHNpemVvZihidWYpIDogbGVuOworCisJCWVlcHJvbV9yZWFkIChDRkdfREVGX0VFUFJPTV9BRERSLCBDRkdfRU5WX09GRlNFVCtvZmYsIGJ1Ziwgbik7CisJCW5ldyA9IGNyYzMyIChuZXcsIGJ1Ziwgbik7CisJCWxlbiAtPSBuOworCQlvZmYgKz0gbjsKKwl9CisKKwlyZXR1cm4gKGNyYyA9PSBuZXcpOworfQorCitzdGF0aWMgdWxvbmcgb2xkc2l6ZXNbXSA9IHsKKwkweDIwMCwKKwkweDgwMCwKKwkwCit9OworCit2b2lkIGNvcHlfb2xkX2Vudih1bG9uZyBzaXplKQoreworCXVjaGFyIG5hbWVfYnVmWzY0XTsKKwl1Y2hhciB2YWx1ZV9idWZbMHg4MDBdOworCXVjaGFyIGM7CisJdWxvbmcgbGVuOworCXVuc2lnbmVkIG9mZjsKKwl1Y2hhciAqbmFtZSwgKnZhbHVlOworCisJbmFtZT0mbmFtZV9idWZbMF07CisJdmFsdWU9JnZhbHVlX2J1ZlswXTsKKwlsZW49c2l6ZTsKKwlvZmYgPSBzaXplb2YobG9uZyk7CisJd2hpbGUgKGxlbiA+IG9mZikgeworCQllZXByb21fcmVhZCAoQ0ZHX0RFRl9FRVBST01fQUREUiwgQ0ZHX0VOVl9PRkZTRVQrb2ZmLCAmYywgMSk7CisJCWlmKGMgIT0gJz0nKSB7CisJCQkqbmFtZSsrPWM7CisJCQlvZmYrKzsKKwkJfQorCQllbHNlIHsKKwkJCSpuYW1lKys9J1wwJzsKKwkJCW9mZisrOworCQkJZG8geworCQkJCWVlcHJvbV9yZWFkIChDRkdfREVGX0VFUFJPTV9BRERSLCBDRkdfRU5WX09GRlNFVCtvZmYsICZjLCAxKTsKKwkJCQkqdmFsdWUrKz1jOworCQkJCW9mZisrOworCQkJCWlmKGMgPT0gJ1wwJykKKwkJCQkJYnJlYWs7CisJCQl9IHdoaWxlKGxlbiA+IG9mZik7CisJCQluYW1lPSZuYW1lX2J1ZlswXTsKKwkJCXZhbHVlPSZ2YWx1ZV9idWZbMF07CisJCQlpZihzdHJuY21wKG5hbWUsImJhdWRyYXRlIiw4KSE9MCkgeworCQkJCXNldGVudihuYW1lLHZhbHVlKTsKKwkJCX0KKworCQl9CisJfQorfQorCisKK3ZvaWQgY2hlY2tfZW52KHZvaWQpCit7CisJdW5zaWduZWQgY2hhciAqczsKKwlpbnQgaT0wOworCWNoYXIgYnVmWzMyXTsKKwliYWNrdXBfdCBiYWNrOworCisJcz1nZXRlbnYoInNlcmlhbCMiKTsKKwlpZighcykgeworCQl3aGlsZShvbGRzaXplc1tpXSkgeworCQkJaWYoY2hlY2tfZW52X29sZF9zaXplKG9sZHNpemVzW2ldKSkKKwkJCQlicmVhazsKKwkJCWkrKzsKKwkJfQorCQlpZighb2xkc2l6ZXNbaV0pIHsKKwkJCS8qIG5vIG9sZCBlbnZpcm9ubWVudCBoYXMgYmVlbiBmb3VuZCAqLworCQkJZ2V0X2JhY2t1cF92YWx1ZXMgKCZiYWNrKTsKKwkJCWlmIChzdHJuY21wIChiYWNrLnNpZ25hdHVyZSwgIk1QTFwwIiwgNCkgPT0gMCkgeworCQkJCXNwcmludGYgKGJ1ZiwgIiVzIiwgYmFjay5zZXJpYWxfbmFtZSk7CisJCQkJc2V0ZW52ICgic2VyaWFsIyIsIGJ1Zik7CisJCQkJc3ByaW50ZiAoYnVmLCAiJXMiLCBiYWNrLmV0aF9hZGRyKTsKKwkJCQlzZXRlbnYgKCJldGhhZGRyIiwgYnVmKTsKKwkJCQlwcmludGYgKCJJTkZPOiAgc2VyaWFsIyBhbmQgZXRoYWRkciByZWNvdmVyZWQsIHVzZSBzYXZlZW52XG4iKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQljb3B5X29sZF9lbnYob2xkc2l6ZXNbaV0pOworCQkJcHJpbnRmICgiSU5GTzogIG9sZCBlbnZpcm9ubWVudCBhanVzdGVkLCB1c2Ugc2F2ZWVudlxuIik7CisJCX0KKwl9CisJZWxzZSB7CisJCS8qIGNoZWNrIGlmIGJhY2sgdXAgaXMgc2V0ICovCisJCWdldF9iYWNrdXBfdmFsdWVzKCZiYWNrKTsKKwkJaWYoc3RybmNtcChiYWNrLnNpZ25hdHVyZSwiTVBMXDAiLDQpIT0wKSB7CisJCQlzZXRfYmFja3VwX3ZhbHVlcygwKTsKKwkJfQorCX0KK30KKworCisKK2V4dGVybiBkZXZpY2VfdCAqc3RkaW9fZGV2aWNlc1tdOworZXh0ZXJuIGNoYXIgKnN0ZGlvX25hbWVzW107CisKK3ZvaWQgc2hvd19zdGRpb19kZXYodm9pZCkKK3sKKwkvKiBQcmludCBpbmZvcm1hdGlvbnMgKi8KKwlwcmludGYgKCJJbjogICAgIik7CisJaWYgKHN0ZGlvX2RldmljZXNbc3RkaW5dID09IE5VTEwpIHsKKwkJcHJpbnRmICgiTm8gaW5wdXQgZGV2aWNlcyBhdmFpbGFibGUhXG4iKTsKKwl9IGVsc2UgeworCQlwcmludGYgKCIlc1xuIiwgc3RkaW9fZGV2aWNlc1tzdGRpbl0tPm5hbWUpOworCX0KKworCXByaW50ZiAoIk91dDogICAiKTsKKwlpZiAoc3RkaW9fZGV2aWNlc1tzdGRvdXRdID09IE5VTEwpIHsKKwkJcHJpbnRmICgiTm8gb3V0cHV0IGRldmljZXMgYXZhaWxhYmxlIVxuIik7CisJfSBlbHNlIHsKKwkJcHJpbnRmICgiJXNcbiIsIHN0ZGlvX2RldmljZXNbc3Rkb3V0XS0+bmFtZSk7CisJfQorCisJcHJpbnRmICgiRXJyOiAgICIpOworCWlmIChzdGRpb19kZXZpY2VzW3N0ZGVycl0gPT0gTlVMTCkgeworCQlwcmludGYgKCJObyBlcnJvciBkZXZpY2VzIGF2YWlsYWJsZSFcbiIpOworCX0gZWxzZSB7CisJCXByaW50ZiAoIiVzXG4iLCBzdGRpb19kZXZpY2VzW3N0ZGVycl0tPm5hbWUpOworCX0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJLyogc3dpdGNoZXMgdGhlIGNzMCBhbmQgdGhlIGNzMSB0byB0aGUgbG9jYXRpb25zLgorCSAgIFdoZW4gYm9vdCBpcyBUUlVFLCB0aGUgdGhlIG1hcHBpbmcgaXMgc3dpdGNoZWQKKwkgICB0byB0aGUgYm9vdCBjb25maWd1cmF0aW9uLCBJZiBpdCBpcyBGQUxTRSwgdGhlCisJICAgZmxhc2ggd2lsbCBiZSBzd2l0Y2hlZCBpbiB0aGUgYm9vdCBhcmVhICovCisKKyN1bmRlZiBTV19DU19EQkcKKyNpZmRlZiBTV19DU19EQkcKKyNkZWZpbmUJU1dfQ1NfUFJJTlRGKGZtdCxhcmdzLi4uKQlwcmludGYgKGZtdCAsIyNhcmdzKQorI2Vsc2UKKyNkZWZpbmUgU1dfQ1NfUFJJTlRGKGZtdCxhcmdzLi4uKQorI2VuZGlmCisKKworaW50IHN3aXRjaF9jcyh1bnNpZ25lZCBjaGFyIGJvb3QpCit7CisgIAl1bnNpZ25lZCBsb25nIHBiY3I7CisJbXRkY3IoZWJjY2ZnYSwgcGIwY3IpOyAvKiBnZXQgY3MwIGNvbmZpZyByZWcgKi8KKwlwYmNyID0gbWZkY3IoZWJjY2ZnZCk7CisJaWYoKHBiY3ImMHgwMDAwMjAwMCk9PTApIHsKKwkJLyogd2UgbmVlZCBvbmx5IHRvIHN3aXRjaCBpZiBib290IGZyb20gTVBTICovCisJCS8qcHJpbnRmKCIgTVBTIGJvb3QgbW9kZSBkZXRlY3RlZC4gIik7Ki8KKwkJLyogcHJpbnRmKCJjczAgY2ZnOiAlbHhcbiIscGJjcik7ICovCisJCWlmKGJvb3QpIHsKKwkJCS8qIHN3aXRjaCB0byBib290IGNvbmZpZ3VyYXRpb24gKi8KKwkJCS8qIHRoaXMgaXMgYSA4Yml0IGJvb3QsIHN3aXRjaCBjczAgdG8gZmxhc2ggbG9jYXRpb24gKi8KKwkJCVNXX0NTX1BSSU5URigic3dpdGNoIHRvIGJvb3QgbW9kZSAoTVBTIG9uIEhpZ2ggYWRkcmVzc1xuIik7CisJCQlwYmNyJj0weDAwMEZGRkZGOyAvKm1hc2sgYmFzZSBhZGRyZXNzIG9mIHRoZSBjczAgKi8KKwkJCXBiY3J8PShGTEFTSF9CQVNFMF9QUkVMSU0gJiAweEZGRjAwMDAwKTsKKwkJCW10ZGNyKGViY2NmZ2EsIHBiMGNyKTsKKwkJCW10ZGNyKGViY2NmZ2QsIHBiY3IpOworCQkJU1dfQ1NfUFJJTlRGKCIgIG5ldyBjczAgY2ZnOiAlbHhcbiIscGJjcik7CisJCQltdGRjcihlYmNjZmdhLCBwYjFjcik7IC8qIGdldCBjczEgY29uZmlnIHJlZyAoZmxhc2gpICovCisJCQlwYmNyID0gbWZkY3IoZWJjY2ZnZCk7CisJCQlTV19DU19QUklOVEYoIiBvbGQgY3MxIGNmZzogJWx4XG4iLHBiY3IpOworCQkJcGJjciY9MHgwMDBGRkZGRjsgLyptYXNrIGJhc2UgYWRkcmVzcyBvZiB0aGUgY3MxICovCisJCQlwYmNyfD0oTVVMVElfUFVSUE9TRV9TT0NLRVRfQUREUiAmIDB4RkZGMDAwMDApOworCQkJbXRkY3IoZWJjY2ZnYSwgcGIxY3IpOworCQkJbXRkY3IoZWJjY2ZnZCwgcGJjcik7CisJCQlTV19DU19QUklOVEYoIiAgbmV3IGNzMSBjZmc6ICVseCwgTVBTIGlzIG9uIEhpZ2ggQWRkcmVzc1xuIixwYmNyKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIG1hcCBmbGFzaCB0byBib290IGFyZWEsICovCisJCQlTV19DU19QUklOVEYoIm1hcCBGbGFzaCB0byBib290IGFyZWFcbiIpOworCQkJcGJjciY9MHgwMDBGRkZGRjsgLyptYXNrIGJhc2UgYWRkcmVzcyBvZiB0aGUgY3MwICovCisJCQlwYmNyfD0oTVVMVElfUFVSUE9TRV9TT0NLRVRfQUREUiAmIDB4RkZGMDAwMDApOworCQkJbXRkY3IoZWJjY2ZnYSwgcGIwY3IpOworCQkJbXRkY3IoZWJjY2ZnZCwgcGJjcik7CisJCQlTV19DU19QUklOVEYoIiAgbmV3IGNzMCBjZmc6ICVseFxuIixwYmNyKTsKKwkJCW10ZGNyKGViY2NmZ2EsIHBiMWNyKTsgLyogZ2V0IGNzMSBjb25maWcgcmVnIChmbGFzaCkgKi8KKwkJCXBiY3IgPSBtZmRjcihlYmNjZmdkKTsKKwkJCVNXX0NTX1BSSU5URigiICBjczEgY2ZnOiAlbHhcbiIscGJjcik7CisJCQlwYmNyJj0weDAwMEZGRkZGOyAvKm1hc2sgYmFzZSBhZGRyZXNzIG9mIHRoZSBjczEgKi8KKwkJCXBiY3J8PShGTEFTSF9CQVNFMF9QUkVMSU0gJiAweEZGRjAwMDAwKTsKKwkJCW10ZGNyKGViY2NmZ2EsIHBiMWNyKTsKKwkJCW10ZGNyKGViY2NmZ2QsIHBiY3IpOworCQkJU1dfQ1NfUFJJTlRGKCIgIG5ldyBjczEgY2ZnOiAlbHggRmxhc2ggaXMgb24gSGlnaCBBZGRyZXNzXG4iLHBiY3IpOworCQl9CisJCXJldHVybiAxOworCX0KKwllbHNlIHsKKwkJU1dfQ1NfUFJJTlRGKCJOb3JtYWwgYm9vdCwgbm8gc3dpdGNoaW5nIG5lY2Vzc2FyeVxuIik7CisJCXJldHVybiAwOworCX0KK30KKworCitpbnQgZG9fbXBsY29tbW9uKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworIAl1bG9uZyBzaXplLHNyYyxsZF9hZGRyOworCWludCByZXN1bHQ7CisJYmFja3VwX3QgYmFjazsKKwljaGFyIHN3OworCXNyYyA9IE1VTFRJX1BVUlBPU0VfU09DS0VUX0FERFI7CisJc2l6ZSA9IElNQUdFX1NJWkU7CisKKwlpZiAoc3RyY21wKGFyZ3ZbMV0sICJmbGFzaCIpID09IDApCisJeworCQlzdyA9IHN3aXRjaF9jcygwKTsgLyogU3dpdGNoIGZsYXNoIHRvIG5vcm1hbCBsb2NhdGlvbiAqLworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZEQykKKwkJaWYgKHN0cmNtcChhcmd2WzJdLCAiZmxvcHB5IikgPT0gMCkgeworIAkJCWNoYXIgKmxvY2FsX2FyZ3NbM107CisJCQlleHRlcm4gaW50IGRvX2ZkY2Jvb3QgKGNtZF90YmxfdCAqLCBpbnQsIGludCwgY2hhciAqW10pOworCQkJcHJpbnRmICgiXG51cGRhdGluZyBib290bG9hZGVyIGltYWdlIGZyb20gZmxvcHB5XG4iKTsKKwkJCWxvY2FsX2FyZ3NbMF0gPSBhcmd2WzBdOworCSAgICAJCWlmKGFyZ2M9PTQpIHsKKwkJCQlsb2NhbF9hcmdzWzFdID0gYXJndlszXTsKKwkJCQlsb2NhbF9hcmdzWzJdID0gTlVMTDsKKwkJCQlsZF9hZGRyPXNpbXBsZV9zdHJ0b3VsKGFyZ3ZbM10sIE5VTEwsIDE2KTsKKwkJCQlyZXN1bHQ9ZG9fZmRjYm9vdChjbWR0cCwgMCwgMiwgbG9jYWxfYXJncyk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlsb2NhbF9hcmdzWzFdID0gTlVMTDsKKwkJCQlsZF9hZGRyPUNGR19MT0FEX0FERFI7CisJCQkJcmVzdWx0PWRvX2ZkY2Jvb3QoY21kdHAsIDAsIDEsIGxvY2FsX2FyZ3MpOworCQkJfQorCQkJcmVzdWx0PW1wbF9wcmdfaW1hZ2UobGRfYWRkcik7CisJCQlzd2l0Y2hfY3Moc3cpOyAvKiBTd2l0Y2ggZmxhc2ggYmFjayAqLworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorI2VuZGlmIC8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZEQykgKi8KKwkJaWYgKHN0cmNtcChhcmd2WzJdLCAibWVtIikgPT0gMCkgeworCSAgICAJCWlmKGFyZ2M9PTQpIHsKKwkJCQlsZF9hZGRyPXNpbXBsZV9zdHJ0b3VsKGFyZ3ZbM10sIE5VTEwsIDE2KTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWxkX2FkZHI9bG9hZF9hZGRyOworCQkJfQorCQkJcHJpbnRmICgiXG51cGRhdGluZyBib290bG9hZGVyIGltYWdlIGZyb20gbWVtb3J5IGF0ICVsWFxuIixsZF9hZGRyKTsKKwkJCXJlc3VsdD1tcGxfcHJnX2ltYWdlKGxkX2FkZHIpOworCQkJc3dpdGNoX2NzKHN3KTsgLyogU3dpdGNoIGZsYXNoIGJhY2sgKi8KKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJaWYgKHN0cmNtcChhcmd2WzJdLCAibXBzIikgPT0gMCkgeworCQkJcHJpbnRmICgiXG51cGRhdGluZyBib290bG9hZGVyIGltYWdlIGZyb20gTVNQXG4iKTsKKwkJCXJlc3VsdD1tcGxfcHJnKHNyYyxzaXplKTsKKwkJCXN3aXRjaF9jcyhzdyk7IC8qIFN3aXRjaCBmbGFzaCBiYWNrICovCisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCXN3aXRjaF9jcyhzdyk7IC8qIFN3aXRjaCBmbGFzaCBiYWNrICovCisKKwl9CisJaWYgKHN0cmNtcChhcmd2WzFdLCAibWVtIikgPT0gMCkKKwl7CisJCXJlc3VsdD0wOworCQlpZihhcmdjPT0zKQorCQl7CisJCQlyZXN1bHQgPSAoaW50KXNpbXBsZV9zdHJ0b2woYXJndlsyXSwgTlVMTCwgMTYpOworCSAgICB9CisJICAgIHNyYz0odW5zaWduZWQgbG9uZykmcmVzdWx0OworCSAgICBzcmMtPUNGR19NRU1URVNUX1NUQVJUOworCSAgICBzcmMtPSgxMDAqMTAyNCk7IC8qIC0gMTAwayAqLworCSAgICBzcmMmPTB4ZmZmMDAwMDA7CisJICAgIHNpemU9MDsKKwkgICAgZG8geworCSAgICAJc2l6ZSsrOworCQkJcHJpbnRmKCJcblxuUGFzcyAlbGRcbiIsc2l6ZSk7CisJCQltZW1fdGVzdChDRkdfTUVNVEVTVF9TVEFSVCxzcmMsMSk7CisJCQlpZihjdHJsYygpKQorCQkJCWJyZWFrOworCQkJaWYocmVzdWx0PjApCisJCQkJcmVzdWx0LS07CisKKwkJfXdoaWxlKHJlc3VsdCk7CisJCXJldHVybiAwOworCX0KKwlpZiAoc3RyY21wKGFyZ3ZbMV0sICJjbGVhcmVudnZhbHVlcyIpID09IDApCisJeworIAkJaWYgKHN0cmNtcChhcmd2WzJdLCAieWVzIikgPT0gMCkKKwkJeworCQkJY2xlYXJfZW52X3ZhbHVlcygpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJaWYgKHN0cmNtcChhcmd2WzFdLCAiZ2V0YmFjayIpID09IDApIHsKKwkJZ2V0X2JhY2t1cF92YWx1ZXMoJmJhY2spOworCQliYWNrLnNpZ25hdHVyZVszXT0wOworCQliYWNrLnNlcmlhbF9uYW1lWzE2XT0wOworCQliYWNrLmV0aF9hZGRyWzIwXT0wOworCQlwcmludGYoIkdldEJhY2tVcDogc2lnbmF0dXJlOiAlc1xuIixiYWNrLnNpZ25hdHVyZSk7CisJCXByaW50ZigiICAgICAgICAgICBzZXJpYWwjOiAgICVzXG4iLGJhY2suc2VyaWFsX25hbWUpOworCQlwcmludGYoIiAgICAgICAgICAgZXRoYWRkcjogICAlc1xuIixiYWNrLmV0aF9hZGRyKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChzdHJjbXAoYXJndlsxXSwgInNldGJhY2siKSA9PSAwKSB7CisJCXNldF9iYWNrdXBfdmFsdWVzKDEpOworCQlyZXR1cm4gMDsKKwl9CisJcHJpbnRmKCJVc2FnZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOworCXJldHVybiAxOworfQorCisKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ET0MpCitleHRlcm4gdm9pZCBkb2NfcHJvYmUodWxvbmcgcGh5c2Fkcik7Cit2b2lkIGRvY19pbml0ICh2b2lkKQoreworICBkb2NfcHJvYmUoTVVMVElfUFVSUE9TRV9TT0NLRVRfQUREUik7Cit9CisjZW5kaWYKKworCisjaWZkZWYgQ09ORklHX1ZJREVPCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lcyB0byBkaXNwbGF5IHRoZSBCb2FyZCBpbmZvcm1hdGlvbgorICogdG8gdGhlIHNjcmVlbiAoc2luY2UgdGhlIFZHQSB3aWxsIGJlIGluaXRpYWxpemVkIGFzIGxhc3QsCisgKiB3ZSBtdXN0IHJlc2VuZCB0aGUgaW5mb3MpCisgKi8KKworI2lmZGVmIENPTkZJR19DT05TT0xFX0VYVFJBX0lORk8KK2V4dGVybiBHcmFwaGljRGV2aWNlIGN0ZmI7CisKK3ZvaWQgdmlkZW9fZ2V0X2luZm9fc3RyIChpbnQgbGluZV9udW1iZXIsIGNoYXIgKmluZm8pCit7CisJLyogaW5pdCB2aWRlbyBpbmZvIHN0cmluZ3MgZm9yIGdyYXBoaWMgY29uc29sZSAqLworCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCVBQQzQwNV9TWVNfSU5GTyBzeXNfaW5mbzsKKwljaGFyIHJldjsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIHB2cjsKKwljaGFyIGJ1Zls2NF07CisJY2hhciB0bXBbMTZdOworCXVuc2lnbmVkIGNoYXIgKnMsICplLCBiYywgc3c7CisJc3dpdGNoIChsaW5lX251bWJlcikKKwl7CisJY2FzZSAyOgorCQkvKiBDUFUgYW5kIGJvYXJkIGluZm9zICovCisJCXB2cj1nZXRfcHZyKCk7CisJCWdldF9zeXNfaW5mbyAoJnN5c19pbmZvKTsKKwkJc3dpdGNoIChwdnIpIHsKKwkJCWNhc2UgUFZSXzQwNUdQX1JCOiByZXY9J0InOyBicmVhazsKKwkJCWNhc2UgUFZSXzQwNUdQX1JDOiByZXY9J0MnOyBicmVhazsKKwkJCWNhc2UgUFZSXzQwNUdQX1JEOiByZXY9J0QnOyBicmVhazsKKwkJCWNhc2UgUFZSXzQwNUdQX1JFOiByZXY9J0UnOyBicmVhazsKKwkJCWRlZmF1bHQ6ICAgICAgICAgICByZXY9Jz8nOyBicmVhazsKKwkJfQorCQkvKiBCb2FyZCBpbmZvICovCisJCWk9MDsKKwkJcz1nZXRlbnYgKCJzZXJpYWwjIik7CisjaWZkZWYgQ09ORklHX1BJUDQwNQorCQlpZiAoIXMgfHwgc3RybmNtcCAocywgIlBJUDQwNSIsIDYpKSB7CisJCQlzcHJpbnRmKGJ1ZiwiIyMjIE5vIEhXIElEIC0gYXNzdW1pbmcgUElQNDA1Iik7CisJCX0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19NSVA0MDUKKwkJaWYgKCFzIHx8IHN0cm5jbXAgKHMsICJNSVA0MDUiLCA2KSkgeworCQkJc3ByaW50ZihidWYsIiMjIyBObyBIVyBJRCAtIGFzc3VtaW5nIE1JUDQwNSIpOworCQl9CisjZW5kaWYKKwkJZWxzZSB7CisJCQlmb3IgKGUgPSBzOyAqZTsgKytlKSB7CisJCQkJaWYgKCplID09ICcgJykKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlmb3IgKDsgcyA8IGU7ICsrcykgeworCQkJCWlmICgqcyA9PSAnXycpIHsKKwkJCQkJKytzOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYnVmW2krK109KnM7CisJCQl9CisJCQlzcHJpbnRmKCZidWZbaV0sIiBTTiAiKTsKKwkJCWkrPTQ7CisJCQlmb3IgKDsgcyA8IGU7ICsrcykgeworCQkJCWJ1ZltpKytdPSpzOworCQkJfQorCQkJYnVmW2krK109MDsKKwkJfQorCQlzcHJpbnRmIChpbmZvLCIgJXMgUFBDNDA1R1AgJWMgJXMgTUh6ICglbHUvJWx1LyVsdSBNSHopIiwKKwkJCWJ1ZixyZXYsCisJCQlzdHJtaHogKHRtcCwgZ2QtPmNwdV9jbGspLCBzeXNfaW5mby5mcmVxUExCIC8gMTAwMDAwMCwKKwkJCXN5c19pbmZvLmZyZXFQTEIgLyBzeXNfaW5mby5wbGxPcGJEaXYgLyAxMDAwMDAwLAorCQkJc3lzX2luZm8uZnJlcVBMQiAvIHN5c19pbmZvLnBsbEV4dEJ1c0RpdiAvIDEwMDAwMDApOworCQlyZXR1cm47CisJY2FzZSAzOgorCQkvKiBNZW1vcnkgSW5mbyAqLworCQlzdyA9IHN3aXRjaF9jcyAoMCk7CisJCXN3aXRjaF9jcyAoc3cpOworCQliYyA9IGluOCAoQ09ORklHX1BPUlRfQUREUik7CisJCXNwcmludGYoaW5mbywgIiAlbHVNQiBSQU0sICVsdU1CIEZsYXNoIENmZyAweCUwMlggJXMgJXMiLAorCQkJZ2QtPmJkLT5iaV9tZW1zaXplIC8gMHgxMDAwMDAsCisJCQlnZC0+YmQtPmJpX2ZsYXNoc2l6ZSAvIDB4MTAwMDAwLAorCQkJYmMsCisJCQlzdyA/ICJNUFMgYm9vdCIgOiAiRmxhc2ggYm9vdCIsCisJCQljdGZiLm1vZGVJZGVudCk7CisJCXJldHVybjsKKwljYXNlIDE6CisJCXNwcmludGYJKGJ1ZiwgIiVzIixDT05GSUdfSURFTlRfU1RSSU5HKTsKKwkJc3ByaW50ZiAoaW5mbywgIiAlcyIsICZidWZbMV0pOworCQlyZXR1cm47CisgICAgfQorICAgIC8qIG5vIG1vcmUgaW5mbyBsaW5lcyAqLworICAgICppbmZvID0gMDsKKyAgICByZXR1cm47Cit9CisjZW5kaWYgLyogQ09ORklHX0NPTlNPTEVfRVhUUkFfSU5GTyAqLworCisjZW5kaWYgLyogQ09ORklHX1ZJREVPICovCmRpZmYgLS1naXQgYS9ib2FyZC9tcGwvY29tbW9uL3BjaS5jIGIvYm9hcmQvbXBsL2NvbW1vbi9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTk2NWY5Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvbXBsL2NvbW1vbi9wY2kuYwpAQCAtMCwwICsxLDEwMiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wKK3wgICAgICAgVGhpcyBzb3VyY2UgY29kZSBoYXMgYmVlbiBtYWRlIGF2YWlsYWJsZSB0byB5b3UgYnkgSUJNIG9uIGFuIEFTLUlTCit8ICAgICAgIGJhc2lzLiAgQW55b25lIHJlY2VpdmluZyB0aGlzIHNvdXJjZSBpcyBsaWNlbnNlZCB1bmRlciBJQk0KK3wgICAgICAgY29weXJpZ2h0cyB0byB1c2UgaXQgaW4gYW55IHdheSBoZSBvciBzaGUgZGVlbXMgZml0LCBpbmNsdWRpbmcKK3wgICAgICAgY29weWluZyBpdCwgbW9kaWZ5aW5nIGl0LCBjb21waWxpbmcgaXQsIGFuZCByZWRpc3RyaWJ1dGluZyBpdCBlaXRoZXIKK3wgICAgICAgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMuICBObyBsaWNlbnNlIHVuZGVyIElCTSBwYXRlbnRzIG9yCit8ICAgICAgIHBhdGVudCBhcHBsaWNhdGlvbnMgaXMgdG8gYmUgaW1wbGllZCBieSB0aGUgY29weXJpZ2h0IGxpY2Vuc2UuCit8Cit8ICAgICAgIEFueSB1c2VyIG9mIHRoaXMgc29mdHdhcmUgc2hvdWxkIHVuZGVyc3RhbmQgdGhhdCBJQk0gY2Fubm90IHByb3ZpZGUKK3wgICAgICAgdGVjaG5pY2FsIHN1cHBvcnQgZm9yIHRoaXMgc29mdHdhcmUgYW5kIHdpbGwgbm90IGJlIHJlc3BvbnNpYmxlIGZvcgorfCAgICAgICBhbnkgY29uc2VxdWVuY2VzIHJlc3VsdGluZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KK3wKK3wgICAgICAgQW55IHBlcnNvbiB3aG8gdHJhbnNmZXJzIHRoaXMgc291cmNlIGNvZGUgb3IgYW55IGRlcml2YXRpdmUgd29yaworfCAgICAgICBtdXN0IGluY2x1ZGUgdGhlIElCTSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIHBhcmFncmFwaCwgYW5kIHRoZQorfCAgICAgICBwcmVjZWRpbmcgdHdvIHBhcmFncmFwaHMgaW4gdGhlIHRyYW5zZmVycmVkIHNvZnR3YXJlLgorfAorfCAgICAgICBDT1BZUklHSFQgICBJIEIgTSAgIENPUlBPUkFUSU9OIDE5OTUKK3wgICAgICAgTElDRU5TRUQgTUFURVJJQUwgIC0gIFBST0dSQU0gUFJPUEVSVFkgT0YgSSBCIE0KKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogQWRhcHRlZCBmb3IgUElQNDA1IDAzLjA3LjAxCisgKiBEZW5pcyBQZXRlciwgTVBMIEFHIFN3aXR6ZXJsYW5kLCBkLnBldGVyQG1wbC5jaAorICoKKyAqIFRPRE86IENsZWFuLXVwCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPHBjaS5oPgorI2luY2x1ZGUgImlzYS5oIgorCisjaWZkZWYgQ09ORklHXzQwNUdQCisjaWZkZWYgQ09ORklHX1BDSQorCisjdW5kZWYgREVCVUcKKworI2luY2x1ZGUgInBpaXg0X3BjaS5oIgorI2luY2x1ZGUgInBjaV9wYXJ0cy5oIgorCit2b2lkIHBjaV9waXA0MDVfd3JpdGVfcmVncyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIHBjaV9kZXZfdCBkZXYsCisJCQkgICBzdHJ1Y3QgcGNpX2NvbmZpZ190YWJsZSAqZW50cnkpCit7CisJc3RydWN0IHBjaV9waXA0MDVfY29uZmlnX2VudHJ5ICp0YWJsZTsKKwlpbnQgaTsKKworCXRhYmxlID0gKHN0cnVjdCBwY2lfcGlwNDA1X2NvbmZpZ19lbnRyeSopIGVudHJ5LT5wcml2WzBdOworCisJZm9yIChpPTA7IHRhYmxlW2ldLndpZHRoOyBpKyspCisJeworI2lmZGVmIERFQlVHCisJCXByaW50ZigiUmVnIDB4JTAyWCBWYWx1ZSAweCUwOGxYIFdpZHRoICUwMmQgd3JpdHRlblxuIiwKKwkJICAgICAgIHRhYmxlW2ldLmluZGV4LCB0YWJsZVtpXS52YWwsIHRhYmxlW2ldLndpZHRoKTsKKyNlbmRpZgorCisJCXN3aXRjaCh0YWJsZVtpXS53aWR0aCkKKwkJeworCQljYXNlIDE6IHBjaV9ob3NlX3dyaXRlX2NvbmZpZ19ieXRlKGhvc2UsIGRldiwgdGFibGVbaV0uaW5kZXgsIHRhYmxlW2ldLnZhbCk7IGJyZWFrOworCQljYXNlIDI6IHBjaV9ob3NlX3dyaXRlX2NvbmZpZ193b3JkKGhvc2UsIGRldiwgdGFibGVbaV0uaW5kZXgsIHRhYmxlW2ldLnZhbCk7IGJyZWFrOworCQljYXNlIDQ6IHBjaV9ob3NlX3dyaXRlX2NvbmZpZ19kd29yZChob3NlLCBkZXYsIHRhYmxlW2ldLmluZGV4LCB0YWJsZVtpXS52YWwpOyBicmVhazsKKwkJfQorCX0KK30KKworCitzdGF0aWMgdm9pZCBwY2lfcGlwNDA1X2ZpeHVwX2lycShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIHBjaV9kZXZfdCBkZXYpCit7CisJdW5zaWduZWQgY2hhciBpbnRfbGluZSA9IDB4ZmY7CisJLyoKKwkgKiBXcml0ZSBwY2kgaW50ZXJydXB0IGxpbmUgcmVnaXN0ZXIKKwkgKi8KKwlpZihQQ0lfREVWKGRldik9PTApIC8qIERldmljZTAgPSBQUEM0MDUgLT4gc2tpcCAqLworCQlyZXR1cm47CisJaWYoUENJX0ZVTkMoZGV2KT09MCkKKwl7CisJCS8qIGFzc3VtaW5nIGFsbCBmdW5jdGlvbiAwIGFyZSB1c2luZyB0aGVpciBJTlRBIyBQaW4qLworCQlpbnRfbGluZT1QQ0lfSVJRX1ZFQ1RPUihkZXYpOworCQlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgaW50X2xpbmUpOworI2lmZGVmIERFQlVHCisJCXByaW50ZigiRml4dXAgSVJROiBkZXYgJWQgKCV4KSBpbnQgbGluZSAlZCAweCV4XG4iLAorCQkgICAgICAgUENJX0RFVihkZXYpLGRldixpbnRfbGluZSxpbnRfbGluZSk7CisjZW5kaWYKKwl9Cit9CisKK2V4dGVybiB2b2lkIHBjaV80MDVncF9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSk7CisKKworc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlciBob3NlID0geworICBjb25maWdfdGFibGU6IHBjaV9waXA0MDVfY29uZmlnX3RhYmxlLAorICBmaXh1cF9pcnE6IHBjaV9waXA0MDVfZml4dXBfaXJxLAorfTsKKwordm9pZCBwY2lfaW5pdCh2b2lkKQoreworCS8qd2Ugd2FudCB0aGUgcHRycyB0byBSQU0gbm90IGZsYXNoIChpZSBkb24ndCB1c2UgaW5pdCBsaXN0KSovCisJaG9zZS5maXh1cF9pcnEgICAgPSBwY2lfcGlwNDA1X2ZpeHVwX2lycTsKKwlob3NlLmNvbmZpZ190YWJsZSA9IHBjaV9waXA0MDVfY29uZmlnX3RhYmxlOworCXBjaV80MDVncF9pbml0KCZob3NlKTsKK30KKworI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KKyNlbmRpZiAvKiBDT05GSUdfNDA1R1AgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL21wbC9jb21tb24vcGNpX3BhcnRzLmggYi9ib2FyZC9tcGwvY29tbW9uL3BjaV9wYXJ0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NDU4NWYKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9tcGwvY29tbW9uL3BjaV9wYXJ0cy5oCkBAIC0wLDAgKzEsMTkyIEBACisgLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMQorICogRGVuaXMgUGV0ZXIsIE1QTCBBRyBTd2l0emVybGFuZCwgZC5wZXRlckBtcGwuY2gKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKyNpZm5kZWYgX1BDSV9QQVJUU19IXworI2RlZmluZSBfUENJX1BBUlRTX0hfCisKKworLyogQm9hcmQgc3BlY2lmaWMgZmlsZSBjb250YWluaW5nOgorICogLSBQQ0kgTWVtb3J5IE1hcHBpbmcKKyAqIC0gUENJIElPIE1hcHBpbmcKKyAqIC0gUENJIEludGVycnVwdCBNYXBwaW5nCisgKi8KKworLyogUElQNDA1IFBDSSBJTlQgUm91dGluZzoKKyAqICAgICAgICAgICAgICAgICAgICAgIElSUTAgIFZFQ1RPUgorICogUElYWDQgSURTRUwgID0gQUQxNiAgSU5UQSMgIDI4IChGdW5jdGlvbiAyIFVTQiBpcyBJTlREIyA9IDMxKQorICogVkdBICAgSURTRUwgID0gQUQxNyAgSU5UQiMgIDI5CisgKiBTQ1NJICBJRFNFTCAgPSBBRDE4ICBJTlRDIyAgMzAKKyAqIFBDMTA0IElEU0VMMCA9IEFEMjAgIElOVEEjICAyOAorICogUEMxMDQgSURTRUwxID0gQUQyMSAgSU5UQiMgIDI5CisgKiBQQzEwNCBJRFNFTDIgPSBBRDIyICBJTlRDIyAgMzAKKyAqIFBDMTA0IElEU0VMMyA9IEFEMjMgIElOVEQjICAzMQorICoKKyAqIGJ1c2RldmZ1bmMgPSBFWFhYIFhYWFggQkJCQiBCQkJCIEREREQgREZGRiBSUlJSIFJSMDAKKyAqICAgICAgICAgICAgICBeICAgICAgICAgXiAgICAgICAgIF4gICAgIF4gICBeCisgKiAgICAgICAgICAgICAzMSAgICAgICAgMjMgICAgICAgIDE1ICAgIDEwICAgNworICogRSA9IEVuYWJsZWQKKyAqIEIgPSBCdXNzbnVtYmVyCisgKiBEID0gRGV2aWNlbnVtYmVyIChEZXZpY2UwID0gQUQxMCkKKyAqIEYgPSBGdW5jdGlvbm51bWJlcgorICogUiA9IFJlZ2lzdGVybnVtYmVyCisgKgorICogRGV2aWNlID0gKGJ1c2RldmZ1bmM+PjExKSArIDEwCisgKiBWZWN0b3IgPSBkZXZpY2VudW1iZXIgJSA0ICsgMjgKKyAqCisgKi8KKyNkZWZpbmUgUENJX0hJR0hFU1RfT05fQk9BUkRfSUQJMTkKKy8qI2RlZmluZSBQQ0lfREVWX05VTUJFUih4KQkoKCh4Pj4xMSkgJiAweDFmKSArIDEwKSAqLworI2RlZmluZSBQQ0lfSVJRX1ZFQ1RPUih4KQkoKFBDSV9ERVYoeCkgKyAxMCkgJSA0KSArIDI4CisKKworCisvKiBQQ0kgRGV2aWNlIExpc3QgZm9yIFBJUDQwNSAqLworCisvKiBNYXBwaW5nOgorICogKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqIKYgUENJIE1lbUFkZHIgfCBQQ0kgSU9BZGRyIHwgTG9jYWwgQWRkciB8IERldmljZSAvIEZ1bmN0aW9uICAgICAgICAgICAgICB8CisgKiArLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogfCAgMHgwMDAwMDAwMCB8ICAgICAgICAgICAgfCAweEEwMDAwMDAwIHwgSVNBIE1lbW9yeSAoaGFyZCB3aXJlZCkgICAgICAgIHwKKyAqIHwgIDB4MDBGRkZGRkYgfCAgICAgICAgICAgIHwgMHhBMEZGRkZGRiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiArLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICB8IDB4MDAwMDAwMDAgfCAweEU4MDAwMDAwIHwgSVNBIElPIChoYXJkIHdpcmVkKSAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgfCAweDAwMDBGRkZGIHwgMHhFODAwRkZGRiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiArLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogfCAgMHg4MDAwMDAwMCB8ICAgICAgICAgICAgfCAweDgwMDAwMDAwIHwgVkdBIENvbnRyb2xsZXIgTWVtb3J5ICAgICAgICAgIHwKKyAqIHwgIDB4ODBGRkZGRkYgfCAgICAgICAgICAgIHwgMHg4MEZGRkZGRiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiArLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogfCAgMHg4MTAwMDAwMCB8ICAgICAgICAgICAgfCAweDgxMDAwMDAwIHwgU0NTSSBDb250cm9sbGVyIE1lbW9yeSAgICAgICAgIHwKKyAqIHwgIDB4ODFGRkZGRkYgfCAgICAgICAgICAgIHwgMHg4MUZGRkZGRiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiArLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICovCisKK3N0cnVjdCBwY2lfcGlwNDA1X2NvbmZpZ19lbnRyeSB7CisJaW50IAkJaW5kZXg7IAkvKiBhZGRyZXNzICovCisJdW5zaWduZWQgbG9uZyAJdmFsOwkvKiB2YWx1ZSAqLworCWludCAJCXdpZHRoOwkvKiBkYXRhIHNpemUgKi8KK307CisKK2V4dGVybiB2b2lkIHBjaV9waXA0MDVfd3JpdGVfcmVncyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKiwKKwkJCQkgIHBjaV9kZXZfdCwKKwkJCQkgIHN0cnVjdCBwY2lfY29uZmlnX3RhYmxlICopOworCisvKiBQSUlYNCBJU0EgQnJpZGdlIEZ1bmN0aW9uIDAgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX3BpcDQwNV9jb25maWdfZW50cnkgcGlpeDRfaXNhX2JyaWRnZV9mMFtdID0geworCXtQQ0lfQ0ZHX1BJSVg0X1NFUklSUSwJMHhEMCwJCTF9LCAvKiBlbmFibGUgQ29udGlub3VzIFNFUklSUSBQaW4gKi8KKwl7UENJX0NGR19QSUlYNF9HRU5DRkcsCTB4MDAwMTAwNDEsCTR9LCAvKiBlbmFibGUgU0VSSVJRcywgSVNBLCBQTlAJKi8KKwl7UENJX0NGR19QSUlYNF9UT00sCTB4RkUsCQkxfSwgLyogVG9wIG9mIE1lbW9yeQkJKi8KKwl7UENJX0NGR19QSUlYNF9YQkNTLAkweDAyQzQsCQkyfSwgLyogZGlzYWJsZSBhbGwgcGVyaSBDUwkqLworCXtQQ0lfQ0ZHX1BJSVg0X1JUQ0NGRywJMHgyMSwJCTF9LCAvKiBlbmFibGUgUlRDCSAgIAkqLworI2lmIGRlZmluZWQoQ09ORklHX1BJUDQwNSkKKwl7UENJX0NGR19QSUlYNF9NQkRNQSwJMHg4MiwJCTF9LCAvKiBzZXQgTUJETUEwIHRvIERNQSAyICAgCSovCisJe1BDSV9DRkdfUElJWDRfTUJETUErMSwJMHg4MywJCTF9LCAvKiBzZXQgTUJETUExIHRvIERNQSAzICAgCSovCisjZW5kaWYKKwl7UENJX0NGR19QSUlYNF9ETEMsCTB4MCwJCTF9LCAvKiBkaXNhYmxlIHBhc3NpdmUgcmVsZWFzZSBmZWF0dXJlICovCisJeyB9CQkJCSAgICAJICAgIC8qIGVuZCBvZiBkZXZpY2UgdGFibGUJKi8KK307CisKKy8qIFBJSVg0IElERSBDb250cm9sbGVyIEZ1bmN0aW9uIDEgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX3BpcDQwNV9jb25maWdfZW50cnkgcGlpeDRfaWRlX2NudHJsX2YxW10gPSB7CisJe1BDSV9DT01NQU5ELAkJMHgwMDAxLAkJMn0sIC8qIGVuYWJsZSBJTyBhY2Nlc3MgCSovCisJe1BDSV9DRkdfUElJWDRfSURFVElNLAkweDgwMDA4MDAwLAk0fSwgLyogZW5hYmxlIEJvdGggSURFIGNoYW5uZWxzCSovCisJeyB9CQkJCQkgICAgLyogZW5kIG9mIGRldmljZSB0YWJsZSAJKi8KK307CisKKy8qIFBJSVg0IFVTQiBDb250cm9sbGVyIEZ1bmN0aW9uIDIgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX3BpcDQwNV9jb25maWdfZW50cnkgcGlpeDRfdXNiX2NudHJsX2YyW10gPSB7CisJe1BDSV9JTlRFUlJVUFRfTElORSwJMzEsCQkxfSwgLyogSW50IHZlY3RvciA9IDMxIAkJKi8KKwl7UENJX0JBU0VfQUREUkVTU180LAkweDAwMDBFMDAxLAk0fSwgLyogU2V0IElPIEFkZHJlc3MgdG8gMHhlMDAwIHRvIDB4ZTAxRiAqLworCXtQQ0lfTEFURU5DWV9USU1FUiwJMHg4MCwJCTF9LCAvKiBMYXRlbmN5IFRpbWVyIDB4ODAgCSovCisJezB4QzAsCQkJMHgyMDAwLAkJMn0sIC8qIExlZ2FjeSBzdXBwb3J0IAkJKi8KKwl7UENJX0NPTU1BTkQsCQkweDAwMDUsCQkyfSwgLyogZW5hYmxlIElPIGFjY2VzcyBhbmQgTWFzdGVyICovCisJeyB9CQkJCQkgICAgLyogZW5kIG9mIGRldmljZSB0YWJsZSAJKi8KK307CisKKy8qIFBJSVg0IFBvd2VyIE1hbmFnZW1lbnQgRnVuY3Rpb24gMyAqLworc3RhdGljIHN0cnVjdCBwY2lfcGlwNDA1X2NvbmZpZ19lbnRyeSBwaWl4NF9wbW1fY250cmxfZjNbXSA9IHsKKwl7UENJX0NPTU1BTkQsCQkweDAwMDEsCQkyfSwgLyogZW5hYmxlIElPIGFjY2VzcyAJKi8KKwl7UENJX0NGR19QSUlYNF9QTUFCLAkweDAwMDA0MDAwLAk0fSwgLyogc2V0IFBNQkEgdG8gInZhbGlkIiB2YWx1ZSAqLworCXtQQ0lfQ0ZHX1BJSVg0X1BNTUlTQywJMHgwMSwJCTF9LCAvKiBlbmFibGUgUE1CQSBJTyBhY2Nlc3MJKi8KKwl7UENJX0NGR19QSUlYNF9TTUJCQSwJMHgwMDAwNTAwMCwJNH0sIC8qIHNldCBTTUJCQSB0byAidmFsaWQiIHZhbHVlICovCisJeyB9CQkJCQkgICAgLyogZW5kIG9mIGRldmljZSB0YWJsZSAJKi8KK307CisvKiBQUEM0MDUgRHVtbXkgb25seSB1c2VkIHRvIHByZXZlbnQgYXV0b3NldHVwIG9uIHRoaXMgaG9zdCBicmlkZ2UgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX3BpcDQwNV9jb25maWdfZW50cnkgaWJtNDA1X2R1bW15W10gPSB7CisJeyB9CQkJCSAgICAJICAgIC8qIGVuZCBvZiBkZXZpY2UgdGFibGUgCSovCit9OworCit2b2lkIHBjaV80MDVncF9zZXR1cF92Z2Eoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCBwY2lfZGV2X3QgZGV2LAorCQkJIHN0cnVjdCBwY2lfY29uZmlnX3RhYmxlICplbnRyeSk7CisKKworc3RhdGljIHN0cnVjdCBwY2lfY29uZmlnX3RhYmxlIHBjaV9waXA0MDVfY29uZmlnX3RhYmxlW109eworCXtQQ0lfVkVORE9SX0lEX0lCTSwgCQkJLyogNDA1IGR1bW15ICovCisJIFBDSV9ERVZJQ0VfSURfSUJNXzQwNUdQLAorCSBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLAorCSBwY2lfcGlwNDA1X3dyaXRlX3JlZ3MsIHsodW5zaWduZWQgbG9uZykgaWJtNDA1X2R1bW15fX0sCisKKwl7UENJX1ZFTkRPUl9JRF9JTlRFTCwgCQkJLyogUElJWDQgSVNBIEJyaWRnZSBGdW5jdGlvbiAwICovCisJIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFBQl8wLAorCSBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLAorCSBwY2lfcGlwNDA1X3dyaXRlX3JlZ3MsIHsodW5zaWduZWQgbG9uZykgcGlpeDRfaXNhX2JyaWRnZV9mMH19LAorCisJe1BDSV9WRU5ET1JfSURfSU5URUwsCQkJLyogUElJWDQgSURFIENvbnRyb2xsZXIgRnVuY3Rpb24gMSAqLworCSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxQUIsCisJIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDEsCisJIHBjaV9waXA0MDVfd3JpdGVfcmVncywgeyh1bnNpZ25lZCBsb25nKSBwaWl4NF9pZGVfY250cmxfZjF9fSwKKworCXtQQ0lfVkVORE9SX0lEX0lOVEVMLAkJCS8qIFBJSVg0IFVTQiBDb250cm9sbGVyIEZ1bmN0aW9uIDIgKi8KKwkgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MUFCXzIsCisJIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDIsCisJIHBjaV9waXA0MDVfd3JpdGVfcmVncywgeyh1bnNpZ25lZCBsb25nKSBwaWl4NF91c2JfY250cmxfZjJ9fSwKKworCXtQQ0lfVkVORE9SX0lEX0lOVEVMLAkJCS8qIFBJSVg0IFVTQiBDb250cm9sbGVyIEZ1bmN0aW9uIDMgKi8KKwkgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MUFCXzMsCisJIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDMsCisJIHBjaV9waXA0MDVfd3JpdGVfcmVncywgeyh1bnNpZ25lZCBsb25nKSBwaWl4NF9wbW1fY250cmxfZjN9fSwKKworCXtQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELAorCSBQQ0lfQ0xBU1NfRElTUExBWV9WR0EsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCisJIHBjaV80MDVncF9zZXR1cF92Z2F9LAorCisJe1BDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsCisJIFBDSV9DTEFTU19OT1RfREVGSU5FRF9WR0EsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCisJIHBjaV80MDVncF9zZXR1cF92Z2F9LAorCisJeyB9Cit9OworI2VuZGlmIC8qIF9QQ0lfUEFSVFNfSF8gKi8KKworCisKKworCg==